﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace QL_Nha_Sach_Phuong_Nam
{
    public partial class FormPhieuXuat : Form
    {
        //Khai bao bien hanh dong
        string action;

        //Khai bao cac lop xu ly
        CXulythongtinsach XulySach;
        CXulyPhieuDeNghiXuatKho XulyPhieuDeNghi;
        CXulyPhieuXuat XulyPhieuXuat;

        //Khai báo biến BackGroundWorker để cập nhật phiếu đề nghị phiếu xuất kho mới được tạo
        public BackgroundWorker loadlstPhieuDeNghiXuatchoxuly;

        public FormPhieuXuat()
        {
            InitializeComponent();
        }

        private void FormPhieuXuat_Load(object sender, EventArgs e)
        {
            //Khoi tao cac CXuly
            XulySach = new CXulythongtinsach();
            XulyPhieuDeNghi = new CXulyPhieuDeNghiXuatKho();
            XulyPhieuXuat = new CXulyPhieuXuat();

            //Load dữ liệu lên cho list phieu xuat
            HienthidanhsachPhieuXuat(XulyPhieuXuat.getDSPhieuXuat());

            #region Load dữ liệu lên cho list phieu de nghi xuat
            foreach (PhieuDeNghiXuatKho p in XulyPhieuDeNghi.getDsPhieuDeNghiXuatKho())
            {
                ListViewItem lvi = lstPhieuDeNghiXuatchoxuly.Items.Add(p.PhieuDeNghiXuatKhoNo);
                lvi.SubItems.Add(p.PhieuDeNghiXuatKhoreason);
                lvi.SubItems.Add(p.PhieuDeNghiXuatKhoDate.ToString());
                lvi.SubItems.Add(p.PhieuDeNghiXuatKhoHandle);
            }
            #endregion


            #region Xử lý biến BackgroundWorker loadlstPhieuDeNghiXuatchoxuly
            loadlstPhieuDeNghiXuatchoxuly = new BackgroundWorker();
            loadlstPhieuDeNghiXuatchoxuly.WorkerReportsProgress = true;
            loadlstPhieuDeNghiXuatchoxuly.WorkerSupportsCancellation = true;

            loadlstPhieuDeNghiXuatchoxuly.DoWork += new DoWorkEventHandler(loadlstPhieuDeNghiXuatchoxuly_DoWork);
            loadlstPhieuDeNghiXuatchoxuly.RunWorkerAsync();
            #endregion
        }

        void loadlstPhieuDeNghiXuatchoxuly_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                if (loadlstPhieuDeNghiXuatchoxuly.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                if (XulyPhieuDeNghi.getDsPhieuDeNghiXuatKho().Count > lstPhieuDeNghiXuatchoxuly.Items.Count)
                {
                    int i = lstPhieuDeNghiXuatchoxuly.Items.Count;
                    foreach (PhieuDeNghiXuatKho p in XulyPhieuDeNghi.getDsPhieuDeNghiXuatKho())
                    {
                        if (XulyPhieuDeNghi.getDsPhieuDeNghiXuatKho().IndexOf(p) == i)
                        {
                            lstPhieuDeNghiXuatchoxuly.Invoke((Action)(() =>
                            {
                                lstPhieuDeNghiXuatchoxuly.BeginUpdate();
                                ListViewItem lvi = lstPhieuDeNghiXuatchoxuly.Items.Add(p.PhieuDeNghiXuatKhoNo);
                                lvi.SubItems.Add(p.PhieuDeNghiXuatKhoreason);
                                lvi.SubItems.Add(p.PhieuDeNghiXuatKhoDate.ToString());
                                lvi.SubItems.Add(p.PhieuDeNghiXuatKhoHandle);
                                if (p.PhieuDeNghiXuatKhoreason.Contains("gap"))
                                    lvi.BackColor = Color.Yellow;
                                else
                                    lvi.BackColor = Color.Blue;
                                lstPhieuDeNghiXuatchoxuly.EndUpdate();
                            }));
                            i++;
                        }
                    }
                    notifyIconthongbao.ShowBalloonTip(10, "Thông báo",
                                                        "Có phiếu đề nghị xuất vừa được tạo",
                                                          ToolTipIcon.Info);

                }
                Thread.Sleep(5000);
            }
        }

        private void btntim_Click(object sender, EventArgs e)
        {
            if (txtimtheoMaPhieuXuat.Text != "")
            {
                var kq = XulyPhieuXuat.getDSPhieuXuat().Where(x => x.PhieuXuatNo == txtimtheoMaPhieuXuat.Text && x.PhietXuatStatus == "live");
                if (kq != null)
                {
                    HienthidanhsachPhieuXuat(kq.ToList<PhieuXuat>());
                }
            }
            else
            {
                var kq = XulyPhieuXuat.getDSPhieuXuat().Where(x => x.PhietXuatStatus == "live");
                if (kq != null)
                {
                    HienthidanhsachPhieuXuat(kq.ToList<PhieuXuat>());
                }
            }

        }

        private void btnThemPhieuXuat_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            txtMaphieuXuat.Text = "**New**";
            txtNgayXuatPhieuXuat.Text = System.DateTime.Now.ToString("dd/mm/yyyy");
            dgvPhieuXuat.Rows.Clear();

            btnThemPhieuXuat.Enabled = false;
            btnSave.Enabled = true;
            btnHuy.Enabled = true;

            dgvPhieuXuat.Columns[3].Visible = true;

            btnXuatKho.Enabled = false;
            btnChuyenkho.Enabled = false;
            #endregion

            #region Xử lý dữ liệu
            action = "add";
            FormchonPhieuDeNghiXuatKho f = new FormchonPhieuDeNghiXuatKho();
            f.ShowDialog();

            //Lấy phiếu đề nghị xuất kho đã chọn
            PhieuDeNghiXuatKho p = f.PhieuDeNghiXuatKho1;
            if (p != null) 
            {
                if (p.PhieuDeNghiXuatKhoType == "xuat")
                    rdbXuatThuong.Checked = true;
                else
                    rdbChuyenKho.Checked = true;
                txtXuatTheo.Text = p.PhieuDeNghiXuatKhoNo;

                var kq = from a in XulyPhieuXuat.getDSPhieuXuat()
                         from b in XulyPhieuXuat.getDSChiTietPhieuXuat()
                         where a.FK_PhieuDeNgheXuatKhoID == p.PhieuDeNghiXuatKhoID && a.PhieuXuatID == b.FK_PhieuXuatID
                         group b by new { Ma = b.Sach.SachNo } into g
                         select new { MaHangHoa = g.Key.Ma, SoLuong = g.Sum(o => o.Quantum) };
                if (kq.Count() > 0)
                {
                    int dem = 0;
                    foreach (var item in kq)
                    {
                        int i = dgvPhieuXuat.Rows.Add();
                        dgvPhieuXuat.Rows[i].Cells[0].Value = item.MaHangHoa;
                        dgvPhieuXuat.Rows[i].Cells[1].Value = p.ChiTietPhieuDeNghiXuatKhos[dem].Sach.SachName;
                        dgvPhieuXuat.Rows[i].Cells[3].Value = p.ChiTietPhieuDeNghiXuatKhos[dem].Quantum - item.SoLuong;
                        dem++;
                    }
                }

                else
                {
                    foreach (ChiTietPhieuDeNghiXuatKho ctp in p.ChiTietPhieuDeNghiXuatKhos)
                    {
                        int i = dgvPhieuXuat.Rows.Add();
                        dgvPhieuXuat.Rows[i].Cells[0].Value = ctp.Sach.SachNo;
                        dgvPhieuXuat.Rows[i].Cells[1].Value = ctp.Sach.SachName;
                        dgvPhieuXuat.Rows[i].Cells[3].Value = ctp.Quantum;
                    }
                }    
            }

            #endregion
        }

        private void btnsuaPhieuXuat_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnThemPhieuXuat.Enabled = false;
            btnsuaPhieuXuat.Enabled = false;
            btnXoaPhieuXuat.Enabled = false;
            btnSave.Enabled = true;
            btnHuy.Enabled = true;
            btnXuatKho.Enabled = false;
            btnChuyenkho.Enabled = false;

            #endregion

            #region Xử lý dữ liệu
            action = "edit";
            #endregion
        }

        private void btnXoaPhieuXuat_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnThemPhieuXuat.Enabled = false;
            btnsuaPhieuXuat.Enabled = false;
            btnXoaPhieuXuat.Enabled = false;
            btnSave.Enabled = true;
            btnHuy.Enabled = true;
            btnXuatKho.Enabled = false;
            btnChuyenkho.Enabled = false;

            #endregion

            #region Xử lý dữ liệu
            action = "delete";
            #endregion
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnThemPhieuXuat.Enabled = true;
            btnSave.Enabled = false;
            btnHuy.Enabled = false;

            dgvPhieuXuat.Columns[3].Visible = false;
            #endregion

            #region Xử lý dữ liệu

            switch (action)
            {
                case "add":
                    {
                        PhieuXuat p = new PhieuXuat();
                        p.PhieuXuatID = XulyPhieuXuat.getDSPhieuXuat().Count + 1;
                        p.PhieuXuatNo = txtMaphieuXuat.Text;
                        p.PhieuXuatDate = System.DateTime.Now;
                        if (rdbXuatThuong.Checked == true)
                            p.PhieuXuatType = "xuat";
                        else
                            p.PhieuXuatType = "chuyen";
                        p.PhieuXuatHandle = "no";
                        p.PhietXuatStatus = "live";
                        p.FK_PhieuDeNgheXuatKhoID = XulyPhieuDeNghi.TimPhieuDeNghiXuatKho(txtXuatTheo.Text).PhieuDeNghiXuatKhoID;
                        //duyet datagridview
                        foreach (DataGridViewRow r in dgvPhieuXuat.Rows)
                        {
                            if (r.IsNewRow)
                                continue;
                            ChiTietPhieuXuat ctp = new ChiTietPhieuXuat();
                            ctp.FK_SachID = XulySach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID;
                            ctp.Quantum = int.Parse(r.Cells[2].Value.ToString());
                            p.ChiTietPhieuXuats.Add(ctp);
                        }

                        XulyPhieuXuat.ThemPhieuXuat(p);

                        #region Sửa lại trạng thái phiếu đề nghị xuất kho
                        PhieuDeNghiXuatKho pdn = new PhieuDeNghiXuatKho();
                        pdn.PhieuDeNghiXuatKhoID = 0;
                        pdn.PhieuDeNghiXuatKhoNo = txtXuatTheo.Text;
                        pdn.PhieuDeNghiXuatKhoHandle = "yes";
                        XulyPhieuDeNghi.SuaTrangThaiPheuDeNghiXuatKho(pdn);
                        #endregion

                        #region Kiểm tra đề nghị xuất đã hoàn thành hay chưa
                        if (KiemTraCompletePhieuDeNghiXuatKho() == true)// Nếu rồi set lại trạng thái complete
                        {
                            XulyPhieuDeNghi.SuaCompletePhieuDeNghiXuatKho(txtXuatTheo.Text);
                        }
                        #endregion

                        break;
                    }
                case "edit":
                    {
                        PhieuXuat p = new PhieuXuat();
                        p.PhieuXuatID = XulyPhieuXuat.TimPhieuXuat(txtMaphieuXuat.Text).PhieuXuatID;
                        p.PhieuXuatNo = txtMaphieuXuat.Text;
                        p.PhieuXuatDate = System.DateTime.Now;
                        p.FK_PhieuDeNgheXuatKhoID = XulyPhieuDeNghi.TimPhieuDeNghiXuatKho(txtXuatTheo.Text).PhieuDeNghiXuatKhoID;
                        foreach (DataGridViewRow r in dgvPhieuXuat.Rows)
                        {
                            if (r.IsNewRow)
                                continue;
                            ChiTietPhieuXuat ctp = new ChiTietPhieuXuat();
                            ctp.FK_SachID = XulySach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID;
                            ctp.Quantum = int.Parse(r.Cells[2].Value.ToString());
                            p.ChiTietPhieuXuats.Add(ctp);
                        }

                        XulyPhieuXuat.SuaPhieuXuat(p);

                        #region Kiểm tra đề nghị xuất đã hoàn thành hay chưa
                        if (KiemTraCompletePhieuDeNghiXuatKho() == true)// Nếu rồi set lại trạng thái complete
                        {
                            XulyPhieuDeNghi.SuaCompletePhieuDeNghiXuatKho(txtXuatTheo.Text);
                        }
                        #endregion
                        break;
                    }
                case "delete":
                    {
                        XulyPhieuXuat.XoaPhieuXuat(txtMaphieuXuat.Text);
                        txtMaphieuXuat.Text = "";
                        txtNgayXuatPhieuXuat.Text="";
                        txtXuatTheo.Text="";
                        dgvPhieuXuat.Rows.Clear();
                        break;
                    }
                default:
                    break;
            }        
            #endregion
        }

        private void btnHuy_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnThemPhieuXuat.Enabled = true;
            btnSave.Enabled = false;
            btnHuy.Enabled = false;

            txtMaphieuXuat.Text = "";
            txtNgayXuatPhieuXuat.Text = "";
            txtXuatTheo.Text = "";

            dgvPhieuXuat.Rows.Clear();
            dgvPhieuXuat.Columns[3].Visible = false;
            #endregion
        }

        //Sự kiện khi chọn 1 phiếu xuất
        private void lstPhieuXuat_SelectedIndexChanged(object sender, EventArgs e)
        {
            foreach (ListViewItem lvi in lstPhieuXuat.SelectedItems)
            {
                string map = lvi.SubItems[0].Text;
                PhieuXuat pn = XulyPhieuXuat.TimPhieuXuat(map);
                HienthiPhieuXuat(pn);
            }

            tabPhieuDeNghiXuatdcGui.SelectedIndex = 1;
        }

        //Sự kiện khi thoát khỏi 1 dòng trong dgvPhieuXuat
        private void dgvPhieuXuat_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != dgvPhieuXuat.RowCount - 1)
            {
                if (dgvPhieuXuat.Rows[e.RowIndex].Cells[2].Value == null)
                {
                    MessageBox.Show("Phải nhập số lượng");
                    return;
                }

                if (dgvPhieuXuat.Rows[e.RowIndex].Cells[3].Value != null)
                {
                    if (int.Parse(dgvPhieuXuat.Rows[e.RowIndex].Cells[2].Value.ToString()) > int.Parse(dgvPhieuXuat.Rows[e.RowIndex].Cells[3].Value.ToString()))
                    {
                        MessageBox.Show("Không được nhập lớn hơn số lượng cho phép");
                        dgvPhieuXuat.Rows[e.RowIndex].Cells[2].Value = dgvPhieuXuat.Rows[e.RowIndex].Cells[3].Value;
                        return;
                    }
                }
            }
        }

        private void HienthidanhsachPhieuXuat(List<PhieuXuat> dsp)
        {
            lstPhieuXuat.Items.Clear();
            foreach (PhieuXuat p in dsp)
            {
                ListViewItem lvi = lstPhieuXuat.Items.Add(p.PhieuXuatNo);
                lvi.SubItems.Add(p.PhieuXuatDate.ToString());
                lvi.SubItems.Add(p.PhieuDeNghiXuatKho.PhieuDeNghiXuatKhoreason.ToString());
            }
        }

        private void HienthiPhieuXuat(PhieuXuat p)
        {
            if (p.PhieuXuatHandle == "yes")
            {
                btnsuaPhieuXuat.Enabled = false;
                btnXoaPhieuXuat.Enabled = false;
                btnXuatKho.Enabled = false;
                btnChuyenkho.Enabled = false;
            }
            else
            {
                btnsuaPhieuXuat.Enabled = true;
                btnXoaPhieuXuat.Enabled = true;
                if (p.PhieuXuatType == "xuat")
                {
                    rdbXuatThuong.Checked = true;
                    btnXuatKho.Enabled = true;
                }
                else
                {
                    rdbChuyenKho.Checked = true;
                    btnChuyenkho.Enabled = true;
                }
            }
            txtMaphieuXuat.Text = p.PhieuXuatNo;
            txtNgayXuatPhieuXuat.Text = p.PhieuXuatDate.Value.ToString("dd/mm/yyyy");
            txtXuatTheo.Text = p.PhieuDeNghiXuatKho.PhieuDeNghiXuatKhoNo;
            HienthiChiTietPhieuXuat(p.ChiTietPhieuXuats.ToList<ChiTietPhieuXuat>());
        }

        private void HienthiChiTietPhieuXuat(List<ChiTietPhieuXuat> dsctp)
        {
            dgvPhieuXuat.Rows.Clear();
            foreach(ChiTietPhieuXuat ctp in dsctp)
            {
                int i = dgvPhieuXuat.Rows.Add();
                dgvPhieuXuat.Rows[i].Cells[0].Value = ctp.Sach.SachNo;
                dgvPhieuXuat.Rows[i].Cells[1].Value = ctp.Sach.SachName;
                dgvPhieuXuat.Rows[i].Cells[2].Value = ctp.Quantum;
            }
        }

        private void FormPhieuXuat_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (loadlstPhieuDeNghiXuatchoxuly.IsBusy)
                loadlstPhieuDeNghiXuatchoxuly.CancelAsync();
        }

        private void btnXuatKho_Click(object sender, EventArgs e)
        {
            if (txtMaphieuXuat.Text == "")
            {
                MessageBox.Show("Ô mã phiếu xuất rỗng hoặc bạn vừa xóa đi nó dẫn đến tình trạng không xuất hoặc chuyển kho được!");
                return;
            }

            //1. Tiến hành xuất kho phiếu xuất
            foreach (DataGridViewRow r in dgvPhieuXuat.Rows)
            {
                if (r.IsNewRow)
                    continue;
                XulyPhieuXuat.XuatKhoThuong(1, XulySach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID, int.Parse(r.Cells[2].Value.ToString()));
            }

            //2. Chuyển trạng thái xử lý của phiếu xuất thành đã xử lý
            XulyPhieuXuat.SuaTrangThaiXuLyPhieuXuat(txtMaphieuXuat.Text);

            btnXuatKho.Enabled = false;
        }

        private void btnChuyenkho_Click(object sender, EventArgs e)
        {
            if (txtMaphieuXuat.Text == "")
            {
                MessageBox.Show("Ô mã phiếu xuất rỗng hoặc bạn vừa xóa đi nó dẫn đến tình trạng không xuất hoặc chuyển kho được!");
                return;
            }

            //1. Tiến hành chuyển kho phiếu xuất
            foreach (DataGridViewRow r in dgvPhieuXuat.Rows)
            {
                if (r.IsNewRow)
                    continue;
                XulyPhieuXuat.ChuyenKho(XulySach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID, int.Parse(r.Cells[2].Value.ToString()));
            }

            //2. Chuyển trạng thái xử lý của phiếu xuất thành đã xử lý
            XulyPhieuXuat.SuaTrangThaiXuLyPhieuXuat(txtMaphieuXuat.Text);

            btnChuyenkho.Enabled = false;
        }

        //Kiểm tra Complete Phiếu đề nghị xuất kho
        private bool KiemTraCompletePhieuDeNghiXuatKho()
        {
            bool kt = true;
            foreach (DataGridViewRow r in dgvPhieuXuat.Rows)
            {
                if (r.IsNewRow)
                    continue;
                if (int.Parse(r.Cells[2].Value.ToString()) < int.Parse(r.Cells[3].Value.ToString()) || int.Parse(r.Cells[2].Value.ToString()) > int.Parse(r.Cells[3].Value.ToString()))
                {
                    kt=false;
                    break;
                }
            }
            return kt;
        }
    }
}
